#pragma once
#include <vector>
#include <Eigen/Eigen>
namespace CGF{
class Logger;
}
class TriMesh;


typedef Eigen::Matrix<double, 6,6> Matrix6d;
typedef Eigen::Matrix<double, 6,1> Vector6d;

class morphing_algo
{
public:
	morphing_algo(TriMesh *s , TriMesh *t);
	~morphing_algo(void);
	void precompute_R_S();
	void compute_interpolation_mesh(float time );
private:
	void computeA(const int &sf, const int &tf, Eigen::Matrix2d & A, Matrix6d & Ainv);
private:
	TriMesh* sourceMesh;
	TriMesh* targetMesh;
	std::vector<TriMesh *> interpolationMeshes; 
	Eigen::Matrix2d *R;
	Eigen::Matrix2d *S;
	Matrix6d *Ainv;
	int nf;
	int nv;

	CGF::Logger *log;
};
